#pragma once


#include <d3d9.h>

#if !defined (get16bits)
#define get16bits(d) ((((unsigned int)(((const unsigned char *)(d))[1])) << 8)\
                       +(unsigned int)(((const unsigned char *)(d))[0]) )
#endif

#pragma warning(disable: 4996)



namespace Helper
{
	static char private_ConcatBuffer[1024];

	inline int GetBitValue( int n, int bitPosition ) 
	{
		return ((n >> bitPosition) & 1);
	}

	inline bool IsDigit(char c)
	{
		return (c >= '0' && c <= '9');
	}


	inline D3DXMATRIX PositionToMatrix(int x, int y)
	{
		D3DXMATRIX ret;

		D3DXMatrixTransformation2D(&ret, 
										&D3DXVECTOR2(0.0f, 0.0f), 
										0.0f, 
										&D3DXVECTOR2(1.0f, 1.0f), 
										&D3DXVECTOR2(0.0f, 0.0f), 
										0.0f, 
										&D3DXVECTOR2((float)x, (float)y));
		
		return ret;
	}


	inline char* StrConcat(char* str, ...)
	{
		va_list args;

		va_start(args, str);
		vsprintf(private_ConcatBuffer, str, args);
		va_end(args);

		return &private_ConcatBuffer[0];
	}


	/*http://www.azillionmonkeys.com/qed/hash.html*/
	inline unsigned int SuperFastHash(const char* data, unsigned int len)
	{
		unsigned int hash = len, tmp;
		int rem;

			if (len <= 0 || data == NULL) return 0;

			rem = len & 3;
			len >>= 2;

			/* Main loop */
			for (;len > 0; len--) {
				hash  += get16bits (data);
				tmp    = (get16bits (data+2) << 11) ^ hash;
				hash   = (hash << 16) ^ tmp;
				data  += 2*sizeof (unsigned short);
				hash  += hash >> 11;
			}

			/* Handle end cases */
			switch (rem) {
				case 3: hash += get16bits (data);
						hash ^= hash << 16;
						hash ^= data[sizeof (unsigned short)] << 18;
						hash += hash >> 11;
						break;
				case 2: hash += get16bits (data);
						hash ^= hash << 11;
						hash += hash >> 17;
						break;
				case 1: hash += *data;
						hash ^= hash << 10;
						hash += hash >> 1;
			}

			/* Force "avalanching" of final 127 bits */
			hash ^= hash << 3;
			hash += hash >> 5;
			hash ^= hash << 4;
			hash += hash >> 17;
			hash ^= hash << 25;
			hash += hash >> 6;

			return hash;
	}
};